From: Ian Campbell Date: Fri, 8 Apr 2011 15:38:59 +0000 (+0100) Subject: libxl: convert an empty tap disk into a qdisk X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22man:///%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22man:/?a=commitdiff_plain;h=847ac5c71d200135c734d9961ee32e2b25c45657;p=xen.git libxl: convert an empty tap disk into a qdisk I'm not sure that empty disks which are is_cdrom are especially valid, or that a cdrom can ever be handled by tapdisk anyway but try to do something sane since it seems that xl's parse_disk_config() routine could potentially generate such a configuration (although whether from a valid input string or not I'm not sure). Signed-off-by: Ian Campbell Committed-by: Ian Jackson --- diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 87bfcabf74..4f6cb8b157 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -983,6 +983,14 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis if (disk->backend == DISK_BACKEND_TAP && !libxl__blktap_enabled(&gc)) disk->backend = DISK_BACKEND_QDISK; + /* + * blktap cannot handle empty disks (aka cdroms). Fall back to + * qdisk because qemu-xen creates the disk based on the xenstore + * entries. + */ + if (disk->backend == DISK_BACKEND_TAP && disk->format == DISK_FORMAT_EMPTY) + disk->backend == DISK_BACKEND_QDISK; + switch (disk->backend) { case DISK_BACKEND_PHY: libxl__device_physdisk_major_minor(disk->pdev_path, &major, &minor); @@ -995,7 +1003,7 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis device.backend_kind = DEVICE_VBD; break; case DISK_BACKEND_TAP: - if (disk->format != DISK_FORMAT_EMPTY) { + { const char *dev = libxl__blktap_devpath(&gc, disk->pdev_path, disk->format); if (!dev) { @@ -1003,8 +1011,8 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis goto out_free; } flexarray_append(back, "tapdisk-params"); - flexarray_append(back, libxl__sprintf(&gc, "%s:%s", - libxl__device_disk_string_of_format(disk->format), + flexarray_append(back, libxl__sprintf(&gc, "%s:%s", + libxl__device_disk_string_of_format(disk->format), disk->pdev_path)); flexarray_append(back, "params"); flexarray_append(back, libxl__strdup(&gc, dev)); @@ -1013,8 +1021,6 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis flexarray_append(back, "physical-device"); flexarray_append(back, libxl__sprintf(&gc, "%x:%x", major, minor)); device.backend_kind = DEVICE_VBD; - - break; } break; case DISK_BACKEND_QDISK: